#include <iostream>
#include <vector>
#include <memory>
using namespace std;
//shared_ptr指针可以进行复制或者赋值，通过维护引用计数记录对象个数
//也可以作为容器的元素
//共享所有权的智能指针，也具备移动语义
void test(){
    shared_ptr<int> sp(new int(20));
    cout<<sp.get()<<endl;
    cout<<*sp<<endl;
    cout<<sp.use_count()<<endl;
    //进行一个拷贝操作
    cout << " 拷贝操作 " <<endl;
    shared_ptr<int>sp2 = sp;
    cout << sp.use_count()<<endl;
    cout << sp2.get() <<endl;
    cout << *sp2 <<endl;
    cout << sp2.use_count()<<endl;
    //赋值操作
    cout << "赋值操作" <<endl;
    shared_ptr<int>sp3(new int(100));
    cout << sp3.use_count()<<endl;
    sp3 = sp2;
    cout << sp.use_count()<<endl;
    cout << sp2.use_count()<<endl;
    cout << sp3.use_count()<<endl;
}
void test2(){
    shared_ptr<int> sp(new int(20));//sp持有值为20的对象，引用计数为1
    vector<shared_ptr<int>>vec;
    
    vec.push_back(sp);//拷贝sp，引用计数为2，sp和vec[0]各持有一个引用
    vec.push_back(std::move(sp));//移动sp
                                 //移动后vec[1]接管原来sp的对象20
                                 //sp被置空，对象引用计数仍为2
    vec.push_back(shared_ptr<int>(new int(30)));//vec[2]独享此对象引用计数1
    cout << *vec[0] <<endl;
    cout << *vec[1] <<endl;
}
int main()
{
    test2();
    return 0;
}

